from django.shortcuts import render

# Create your views here.
#1.记录APPID和网关（类似于api.meiduo.site）
#2.我们需要创建２套公钥和私钥
#2.1我们的工程一套（公钥和私钥）
#2.2支付宝一套（公钥和私钥）

from rest_framework.permissions import IsAuthenticated

from rest_framework.views import APIView
from rest_framework.response import Response
from order.models import OrderInfo
from rest_framework import status
from alipay import AliPay
from mail import settings

# Create your views here.
from pay.models import Payment


class PaymentView(APIView):
    """
    GET     /pay/orders/order_id/
    # 1.需要让前端把订单id传递过来
    # 2. 根据id查询信息
    # 3. 创建aplipay对象那个
    # 4. 生成 order_string
    # 5. 拼接最终的url
    """
    permission_classes = [IsAuthenticated]
  # permission_classes = [IsAuthenticated]

    def get(self,request,order_id):
        #1.需要让前端把订单id传递过来
        #2.根据id查询信息
        try:
            #只根据订单id，也是可以查询出订单信息
            #为了查询的准确，可以传递更多的参数，查询的订单应该是未支付状态的订单

            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return Response({'message':'订单信息有误'},status=status.HTTP_400_BAD_REQUEST)
        # 创建支付对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None, # 默认回调url
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            sign_type='RSA2', # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG #默认False
        )
        # 生成order_string
        #如果你是python3的用户，使用默认的字符串即可
        subject = '测试订单'
        # 电脑网站支付，需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),#将浮点数转换为字符串
            subject=subject,
            return_url='http://www.meiduo.site:8080/pay_success.html',
        )
        # 构造支付地址
        alipay_url = settings.ALIPAY_URL + '?' + order_string
        # 返回响应
        return Response({'alipay_url':alipay_url})

class PaymentStatuView(APIView):
    """
    #1.根据回调的url来获取参数，并对参数进行处理
    #2.创建alipay的对象
    #3.查询交易状态
    #4.如果成功，则将订单信息和支付宝订单号保存，并且改变订单信息
    #5.如果失败，返回400
    """

    def put(self,request):
        #1.根据回调的url来获取参数，并对参数进行处理
        #.dict就是将query_params的类型转换为字典类型
        data = request.query_params.dict()
        signature = data.pop('sign')

        #2.创建alipay的对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            alipay_public_key_string=alipay_public_key_string,  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )
        #3.查询交易状态
        success = alipay.verify(data,signature)
        if success:

            #4.如果成功，则将订单信息和支付宝订单号保存，并且改变订单信息
            #4.1则将订单信息和支付宝订单号保存
            # trade_no	String	必填	64	支付宝交易号	2013112011001004330000121536
            # out_trade_no	String	必填	64	商家订单号	6823789339978248
            trade_no = data.get('trade_no')
            out_trade_no = data.get('out_trade_no')
            Payment.objects.create(
               order_id=out_trade_no, #商家的
                trade_id=trade_no #支付宝的
            )
            #4.2并且改变订单信息
            OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])

            return Response({'trade_id':out_trade_no})
        # 5.如果失败，返回400
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)



